/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package edu.uoc.tfc.exuoc.vistes;

import edu.uoc.tfc.exuoc.config.Config;
import edu.uoc.tfc.exuoc.controladors.InterfaceGestor;
import edu.uoc.tfc.exuoc.controladors.GestorItems;
import edu.uoc.tfc.exuoc.controladors.GestorContenidors;
import edu.uoc.tfc.exuoc.controladors.AbstractInGestor;
import edu.uoc.tfc.exuoc.errors.BuitException;
import edu.uoc.tfc.exuoc.errors.LlistatDAOException;
import edu.uoc.tfc.exuoc.utils.Eines;
import edu.uoc.tfc.exuoc.utils.seguretat.InjeccioCodi;

import edu.uoc.tfc.exuoc.model.Item;
import edu.uoc.tfc.exuoc.model.Contenidor;
import edu.uoc.tfc.exuoc.controladors.GestorLogs ;

import edu.uoc.tfc.exuoc.consultes.ContenidorLlistat;
import edu.uoc.tfc.exuoc.consultes.ItemLlistat;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

import com.opensymphony.xwork2.ActionSupport;
import org.hibernate.HibernateException;

/**
 *
 * @author emoreno
 */
public class IPrincipal extends AbstractInGestor {

    //private com.opensymphony.xwork2.util.logging.Logger log;
    //7-11-11 GestorContenidors gc= new GestorContenidors();
    //private GestorLogs  log=GestorLogs .getLogger(this.getClass().getName());
    //private Iterator<Contenidor> llistaContenidors;
    //private Iterator<Item> llistaUltimsItems ;
    
  /*  @Deprecated
    private List<Contenidor> llistaContenidors= new ArrayList<Contenidor>();
    @Deprecated
    private List<Item> llistaUltimsItems =new ArrayList<Item>();
*/
    private List<ContenidorLlistat> llistaCon = new ArrayList<ContenidorLlistat>();
    private List<ItemLlistat> llistaItem= new ArrayList<ItemLlistat>();

    private int nContenidors=0;
    private int nItems=0;
    private int pos=0;

    //Identificador de sessió
    //private String idSessio="";
    

    private int contenidorsPerPagina=Config.CONTENIDOR_PAGE;
    private int itemsPerPagina=Config.ITEM_PAGE;


    public IPrincipal(){
        }

    @Override
    public void finalize(){

        this.setContenidorsPerPagina(0);
        this.setItemsPerPagina(0);
   //  this.setLlistaContenidors(null);
   //     this.setLlistaUltimsItems(null);
        this.setLog(null);
        this.setNContenidors(0);
        this.setNItems(0);
        this.pos=0;
        //7-11-11  if (this.gc!=null) gc.tancar();
    }

    @Override
    public void prepare()   {
        //Actualitzem la data de la sessió per l'usuari i assignem a idSessio
        //la sessió que li correspon.
        super.prepare();

    }
   

  /*  public String getIdSessio() {
        return idSessio;
    }

    public void setIdSessio(String idSessio) {
        this.idSessio = idSessio;
    }*/

    public int getContenidorsPerPagina() {
        return this.contenidorsPerPagina;
    }

    public void setContenidorsPerPagina(int contenidorsPerPagina) {
        this.contenidorsPerPagina = contenidorsPerPagina;
    }

    public int getItemsPerPagina() {
        return this.itemsPerPagina;
    }

    public void setItemsPerPagina(int itemsPerPagina) {
        this.itemsPerPagina = itemsPerPagina;
    }


    public int getPos() {
        return pos;
    }

    //Es filtra ja que és un valor que es pot passar com a paràmetre a l'URL
    public void setPos(int pos) {
        InjeccioCodi filtre=new InjeccioCodi();
        this.pos = Integer.parseInt(filtre.netejar(pos));
    }


    public void setNItems(int _nItems) {
        this.nItems = _nItems;
    }
    public void setNContenidors(int _nContenidors) {
        this.nContenidors = _nContenidors;
    }

 /*   public void setLlistaUltimsItems(List<Item> _llistaUltimsItems) {
        this.llistaUltimsItems = _llistaUltimsItems;
    }
    public void setLlistaContenidors(List<Contenidor> _llistaContenidors) {
        this.llistaContenidors = _llistaContenidors;
    }*/

     public void setLlistaCon(List<ContenidorLlistat> _llistaCon) {
        this.llistaCon = _llistaCon;
    }

     public List<ContenidorLlistat> getLlistaCon() {

      //24 9:48  if (this.llistaCon.equals(null))
            //24 9:48llistaCon=this.omplirLlistaContenidors(this.getPos(),
//                    (this.getPos()+this.getContenidorsPerPagina()));

        return llistaCon;
    }

     public void setLlistaItem(List<ItemLlistat> _llistaItem) {
        this.llistaItem = _llistaItem;
    }

     public List<ItemLlistat> getLlistaItem() {

        /*7-11-11 if (this.llistaItem.equals(null))
            llistaItem=this.omplirLlistaUltimsItems();
         *
         */
        return llistaItem;
    }

    public int getNItems() {
        /* 7-11-11 if (this.nItems==Config.valorNullInt)
            this.setNItems(this.quants(Item.class));
         *
         */
        return nItems;
    }

    public int getNContenidors() {
       /* 7-11-11 if (this.nContenidors==Config.valorNullInt)
            this.setNContenidors(this.quants(Contenidor.class));
        *
        */
        return this.nContenidors;
    }

/* 7-11-11    @Deprecated
    public List<Contenidor> getLlistaContenidors() {
        if (llistaContenidors==null){
            //20 GestorContenidors gc= new GestorContenidors();
            //this.omplirLlistaContenidors(0,this.quants(Contenidor.class));
            this.omplirLlistaContenidors(this.getPos(),(this.getPos()+Config.CONTENIDOR_PAGE));
        }
        return llistaContenidors;
    }
*/
/*7-11-11    public List<Item> getLlistaUltimsItems() {
        if (llistaUltimsItems==null) {
            //GestorItems gi=new GestorItems();
            this.omplirLlistaUltimsItems();
        }

        return llistaUltimsItems;
    }

*/
/*    public GestorLogs  getLog() {
        return log;
    }

    public void setLog(GestorLogs  log) {
        this.log = log;
    }
*/
  
    private List<ContenidorLlistat> omplirLlistaContenidors(int ini, int fi){

        Iterator <Contenidor> ll=null;
        List<ContenidorLlistat> llistaC = new ArrayList<ContenidorLlistat>();
        GestorContenidors gc=GestorContenidors.getInstance();

        try {
            ll=gc.llistat(ini, fi);
            while (ll.hasNext()){
                Contenidor c=(Contenidor)ll.next();
                llistaC.add(new ContenidorLlistat(c.getId(),c.getNom(),c.getDatapub(),c.getItems().size()));
            }
            ll=null;
            gc.tancar();
        }catch (HibernateException ex) {
                this.getLog().error("no s'ha pogut obtenir el nombre de contenidors",ex.getLocalizedMessage());


        }catch (LlistatDAOException ex) {
                this.getLog().error("Error: Llistat. ",ex.getLocalizedMessage() );
        }finally{
            gc.tancar();
        }
        //ll=null;
        //gc.tancar();
        return llistaC;
    }

/* 7-11-11    @Deprecated
    public void omplirLlistaContenidors_PerBorrar(int ini, int fi){

        Iterator <Contenidor> llista=null;
        GestorContenidors gc=new GestorContenidors();

        //String nombre=Config.valorNullStr;

        if (this.llistaContenidors.isEmpty()) {
            try {

                llista=gc.llistatContenidors(ini, fi);
                while (llista.hasNext()){
                    Contenidor c=(Contenidor)llista.next();
                    this.llistaContenidors.add(new Contenidor(c.getId(),c.getNom(),c.getDataPub()));
                }
                llista=null;
                gc.tancar();
                //this.setLlistaContenidors(gc.llistatContenidors(ini, fi));
                //this.setQuants(this.quants());
            } catch (HibernateException ex) {
                log.error("no s'ha pogut obtenir el nombre de contenidors",ex.getLocalizedMessage());
            }catch (LlistatDAOException ex) {
                log.error("Nombre de contenidors buit",ex.getLocalizedMessage());
            }//finally{
             //   gc.tancar();
            //}
        }
    }
*/

     private List<ItemLlistat> omplirLlistaUltimsItems(){

        Iterator <Item> ll=null;
        List<ItemLlistat> llistaI = new ArrayList<ItemLlistat>();

        try {

            GestorItems gi = GestorItems.getInstance();
            ll=gi.llistaUltimsItems();
            while (ll.hasNext()){
                Item i=ll.next();
                llistaI.add(
                        new ItemLlistat(i.getId(),i.getNom(),i.getDatapub(),
                            i.getAutor(),i.getVisites(),i.getArxiu().getTipus(),
                            i.getContenidor().getNom(),i.getPrivat()) );
            }
            gi.tancar();
        }catch (HibernateException ex) {
                this.getLog().error("no s'ha pogut obtenir el nombre de contenidors."
                        +ex.getLocalizedMessage());

        }catch (LlistatDAOException ex) {
                this.getLog().error("llista buida d`Ítems ");
            }
        ll=null;
        return llistaI;
    }

 /*7-11-11   @Deprecated
    public void omplirLlistaUltimsItems_PErBorrar(){
         Iterator<Item> llista=null;
         if (getLlistaUltimsItems().isEmpty()){
            try {
                GestorItems gi = new GestorItems();
                llista=gi.llistaUltimsItems();
                while (llista.hasNext()){
                    Item i=(Item)llista.next();
                    //21 this.llistaUltimsItems.add(new Item(i.getId(),i.getNom(),i.getDataPub(),i.getDescripcio(),null,i.getVisites(),i.getAutor(),null));
                    this.llistaUltimsItems.add(i);
                }
                gi.tancar();
               // this.setLlistaUltimsItems(gi.llistaUltimsItems());
                //llista=gi.llistaUltimsItems();

            } catch (HibernateException ex) {
                log.error("Error en obtenir la llista dels últims items.", ex.getLocalizedMessage());
            }catch (BuitException ex) {
                log.error("llista buida d`Ítems ");
            }
         }

     }

*/

 /**
 *
 * @return nombre d'elements Items o Contenidors (Classe)
 */
    public int quants(Class classe){
        int num=Config.valorNullInt;
        String classeNom=classe.getSimpleName();
        InterfaceGestor gestor =null;

      try {

            if ( classeNom.equals(Contenidor.class.getSimpleName())){
                gestor=GestorContenidors.getInstance();
                //num = gc.numContenidors();
                //20 gestor.tancar();
            }else if (classeNom.equals(Item.class.getSimpleName())){
                gestor = GestorItems.getInstance();
                //num = gestor.numItems();
                //gestor.tancar();
            }else return Config.valorNullInt;

            num = gestor.num();

           // Eines.escriu("Itmes:"+num);
            if (gestor!=null) gestor.tancar();
           // Eines.escriu("Itmes:"+num);
                
        } catch (HibernateException ex) {
            String[] llista ={classe.getSimpleName(),ex.getLocalizedMessage()};
            this.getLog().error("no s'ha pogut obtenir el nombre d'elements ,Classe :{}. {}",llista);
            //num=0;
        }catch(BuitException ex){
            String[] llista ={classe.getSimpleName(),ex.getLocalizedMessage()};
            this.getLog().error("llista buida. Classe :{}. {}",llista);
            //num=0;
        }catch(NullPointerException ex){
            String[] llista ={classe.getSimpleName(),ex.getLocalizedMessage()};
            this.getLog().error("s'ha indicat un valor null. {}",ex.getLocalizedMessage());
        }
        return num;

    }

   
    // Procediment per defecte del "namespace" Arrel del web
    @Override
    public String execute() {
        
        
        //20 GestorContenidors gc= new GestorContenidors();
        //20 GestorItems gi = new GestorItems();

        try {
            this.setNContenidors(this.quants(Contenidor.class));
            this.setNItems(this.quants(Item.class));

            if (!comprovarLimits(this.getPos(),0,this.getNContenidors())) {
                this.addActionError("Límits de posició fora de rang");
                return ActionSupport.ERROR;
            }

            //if (this.getLlistaCon().isEmpty())
                this.setLlistaCon(
                        this.omplirLlistaContenidors( this.getPos(),
                            this.getPos()+this.getContenidorsPerPagina()));

            // this.setLlistaCon(this.omplirLlistaContenidors(this.getPos(), this.getPos()+Config.CONTENIDOR_PAGE-1));

         //   if (this.getLlistaItem().isEmpty())
                this.setLlistaItem(
                        this.omplirLlistaUltimsItems());
        }catch(NullPointerException e){
            this.getLog().error("Error obtenint la llista de dades necessàries. {}",e.getLocalizedMessage());
        }
        //this.omplirLlistaUltimsItems();
        //20 gi.tancar();
        //20 gc.tancar();

        return ActionSupport.SUCCESS;
    }

 
 /**
  *
  * MAIN
  */
    public static void main(String[] args){
        //TODO : proves
        IPrincipal ip=new IPrincipal();
        ip.execute();
        Eines.escriu("nombre d`ítems: "+ip.getNItems());
        Eines.escriu("nombre de Contenidors: "+ip.getNContenidors());
        Iterator<ContenidorLlistat> i=ip.getLlistaCon().iterator();
        while (i.hasNext()){
            ContenidorLlistat lc=i.next();
            Eines.escriu(lc.getNom());
        }

//        Eines.escriu("nombre de contenidors: "+ip.getNContenidors());
//        Eines.escriu("nombre d`ítems: "+ip.quants(Item.class));
//        Eines.escriu("nombre de contenidors: "+ip.quants(Contenidor.class));

        //Eines.escriu(ip.llistaUltimsItems.iterator().next().getNom());
        //Eines.escriu(ip.llistaContenidors.iterator().next().getNom());

       
        
    }
}
